#pragma once

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

class GLCamera
{
protected:
    glm::vec3 m_front;      // 指向原点的方向
    glm::vec3 m_up;         // 正交于向前方向的上方
    glm::vec3 m_right;      // 正交于向前方向的右方
    glm::vec3 m_worldUp;    // 世界上方项，固定不变 (0, 1, 0)

    // 欧拉角：俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll)，我们不需要用到滚转角
    float m_distance;   // 到原点的距离
    float m_pitch;      // 与 xz 平面的夹角
    float m_yaw;        // 与 x 轴的夹角

public:
    GLCamera(float distance = 1.0f, float pitch = 0.0f, float yaw = 90.0f);

    glm::mat4 GetViewMatrix() const;
    glm::vec3 GetPosition() const;
    float GetDistance() const;
    float GetPitch() const;
    float GetYaw() const;

    void SetDistance(float d);
    void SetPitch(float pitch);
    void SetYaw(float yaw);

protected:
    // 通过欧拉角计算方向向量
    void UpdateCameraVectors();
};
